using System;
using System.Collections.Generic;
using System.Text;

namespace eyeArchive.Sql
{
	public static class SqlConvert
	{
		private static SortedList<string, string> dataTypes;

		public static string GetTypeMask(string dataType)
		{
			return GetTypeMask(dataType, true, false);
		}

		public static string GetTypeMask(string dataType, bool includeBlobs, bool returnNullIfNotFound)
		{
			if (dataTypes == null)
			{
				dataTypes = new SortedList<string, string>();

				// --- datatype -----------------------------------------------------
				// 0: Type
				// 1: Length
				// 2: Length == -1 ? MAX : Length
				// 3: Precision
				// 4: Scale

				dataTypes.Add("bigint", "{0}");
				dataTypes.Add("bit", "{0}");
				dataTypes.Add("datetime", "{0}");
				dataTypes.Add("float", "{0}");
				dataTypes.Add("int", "{0}");
				dataTypes.Add("money", "{0}");
				dataTypes.Add("real", "{0}");
				dataTypes.Add("smalldatetime", "{0}");
				dataTypes.Add("smallint", "{0}");
				dataTypes.Add("smallmoney", "{0}");
				dataTypes.Add("sql_variant", "{0}");
				dataTypes.Add("sysname", "{0}");
				dataTypes.Add("timestamp", "{0}");
				dataTypes.Add("tinyint", "{0}");
				dataTypes.Add("uniqueidentifier", "{0}");
				dataTypes.Add("xml", "{0}");
				// --- datatype(length) ---------------------------------------------
				dataTypes.Add("binary", "{0}({1})");
				dataTypes.Add("char", "{0}({1})");
				dataTypes.Add("nchar", "{0}({1})");
				// --- datatype(precision,scale) ------------------------------------
				dataTypes.Add("decimal", "{0}({3},{4})");
				dataTypes.Add("numeric", "{0}({3},{4})");
				// --- datatype(MAX) ------------------------------------------------
				dataTypes.Add("nvarchar", "{0}({2})");
				dataTypes.Add("varbinary", "{0}({2})");
				dataTypes.Add("varchar", "{0}({2})");
				// === Not supported: "ntext", "text", "image" ======================
				dataTypes.Add("ntext", "{0}");
				dataTypes.Add("text", "{0}");
				dataTypes.Add("image", "{0}");
			}

			if (includeBlobs == false)
				dataType = dataType.Replace("ntext", "").Replace("text", "").Replace("image", "");

			if (dataTypes.ContainsKey(dataType) == true)
				return dataTypes[dataType];
			else
				// Returning null is important for example:
				// To identify text comment -> Instead, I should cast text field into varcahr(max)
				return (returnNullIfNotFound == true ? null : "{0}");
		}
	}
}
